package com.ihr360.job.core;

import com.ihr360.job.core.entity.JobExecution;

/**
 * Batch domain object representing a job. Job is an explicit abstraction
 * representing the configuration of a job specified by a developer. It should
 * be noted that restart policy is applied to the job as a whole and not to a
 * step.
 *
 * @author Dave Syer
 */
public interface Job {
    String getName();

    int getStepsCount();

    /**
     * Flag to indicate if this job can be restarted, at least in principle.
     *
     * @return true if this job can be restarted after a failure
     */
    boolean isRestartable();

    /**
     * Run the {@link JobExecution} and update the meta information like status
     * and statistics as necessary. This method should not throw any exceptions
     * for failed execution. Clients should be careful to inspect the
     * {@link JobExecution} status to determine success or failure.
     *
     * @param execution a {@link JobExecution}
     */
    void execute(JobExecution execution);

    /**
     * If clients need to generate new parameters for the next execution in a
     * sequence they can use this incrementer. The return value may be null, in
     * the case that this job does not have a natural sequence.
     *
     * @return in incrementer to be used for creating new parameters
     */
    JobParametersIncrementer getJobParametersIncrementer();

    /**
     * A validator for the job parameters of a {@link JobExecution}. Clients of
     * a Job may need to validate the parameters for a launch, before or during
     * the execution.
     *
     * @return a validator that can be used to check parameter values (never
     * null)
     */
    JobParametersValidator getJobParametersValidator();
}